Spring Boot ORM-এ Pagination এবং Sorting হলো ডেটাবেস থেকে ডেটা রিট্রিভ করার প্রক্রিয়া যেখানে বড় ডেটাসেটকে পেজ আকারে বিভক্ত করে উপস্থাপন করা হয় এবং নির্দিষ্ট ক্রমানুসারে ডেটা সাজানো যায়। Spring Data JPA সহজে এই কাজটি করতে পারে।
Pagination এবং Sorting কীভাবে কাজ করে?
- Pagination: বড় ডেটাসেটকে ছোট ছোট পেজে বিভক্ত করা হয়। এটি সার্ভারের লোড কমায় এবং ডেটা দেখার সময় উন্নত পারফরম্যান্স নিশ্চিত করে।
- Sorting: ডেটাবেস থেকে ডেটা নির্দিষ্ট ক্রমানুসারে সাজানো হয়, যেমন নাম বা তারিখ অনুসারে।
Spring Data JPA এর মাধ্যমে Pageable এবং Sort ইন্টারফেস ব্যবহার করে Pagination এবং Sorting সহজেই ইমপ্লিমেন্ট করা যায়।
উদাহরণ: Pagination এবং Sorting ব্যবহার
১. Maven ডিপেনডেন্সি
pom.xml ফাইলে প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
২. Entity তৈরি
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String department;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
৩. Repository ইন্টারফেস
Spring Data JPA এর মাধ্যমে Pagination এবং Sorting ইমপ্লিমেন্ট করতে JpaRepository ব্যবহার করা হয়।
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
৪. সার্ভিস ক্লাস
Pagination এবং Sorting এর জন্য সার্ভিস ক্লাস তৈরি করুন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Page<Employee> getEmployees(int page, int size, String sortBy, String sortDirection) {
Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending();
Pageable pageable = PageRequest.of(page, size, sort);
return employeeRepository.findAll(pageable);
}
}
৫. কন্ট্রোলার ক্লাস
REST API এর মাধ্যমে Pagination এবং Sorting এর ডেটা প্রদান করুন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping
public Page<Employee> getEmployees(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "name") String sortBy,
@RequestParam(defaultValue = "asc") String sortDirection
) {
return employeeService.getEmployees(page, size, sortBy, sortDirection);
}
}
Pagination এবং Sorting ব্যবহার করার পদ্ধতি
API কল করার সময় Query Parameters ব্যবহার করে Pagination এবং Sorting কাস্টমাইজ করা যায়। উদাহরণস্বরূপ:
ডেটা পেজ আকারে পেতে:
GET /employees?page=1&size=5ডেটা নির্দিষ্ট ক্রমানুসারে সাজাতে:
GET /employees?sortBy=name&sortDirection=desc
Pagination এবং Sorting এর সুবিধা
- বড় ডেটাসেট পরিচালনা: বড় আকারের ডেটা সহজে দেখা ও প্রক্রিয়া করা যায়।
- পারফরম্যান্স উন্নত করে: ছোট ডেটাসেট লোড করে সার্ভারের লোড কমানো যায়।
- ব্যবহারকারী অভিজ্ঞতা উন্নত করে: পেজভিত্তিক ডেটা দেখানোর ফলে ব্যবহারকারীদের অভিজ্ঞতা আরও ভালো হয়।
- ডেটা সাজানোর নমনীয়তা: যে কোনো ফিল্ডে ASC বা DESC অর্ডারে ডেটা সাজানো যায়।
Pagination এবং Sorting Spring Boot ORM এর একটি শক্তিশালী ফিচার যা ডেটাবেস অপারেশন আরও সংগঠিত এবং কার্যকর করে। এটি ব্যবহার করে ডেভেলপাররা দ্রুত এবং সহজে ডেটা ম্যানেজ করতে পারে।
স্প্রিং বুট ORM-এ ডেটাবেস থেকে ডেটা ফেচ করার সময় Pagination এবং Sorting একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। বড় ডেটাসেট নিয়ে কাজ করার সময় এই দুটি ফিচার ডেটার কার্যকর ব্যবস্থাপনা এবং প্রয়োগে সাহায্য করে।
Pagination (পাতায় বিভাজন)
Pagination হলো বড় ডেটাসেটকে ছোট ছোট পৃষ্ঠায় বিভক্ত করার একটি প্রক্রিয়া, যা ক্লায়েন্ট অ্যাপ্লিকেশন বা UI-তে ডেটা প্রদর্শন সহজ করে।
Pagination-এর প্রয়োজনীয়তা:
- পারফরম্যান্স উন্নয়ন: ডাটাবেস থেকে বড় আকারের ডেটাসেট একবারে ফেচ না করে ছোট ছোট অংশে ফেচ করলে সার্ভারের লোড কমে।
- ব্যবহারকারীর অভিজ্ঞতা বৃদ্ধি: একাধিক পৃষ্ঠায় ডেটা প্রদর্শন করলে ব্যবহারকারী সহজে ডেটা দেখতে পারেন।
- মেমোরি ব্যবস্থাপনা: ডেটার অংশ অনুযায়ী মেমোরি ব্যবহারের সুযোগ দেয়।
- ডেটা লোডিং অপ্টিমাইজেশন: ডেটার নির্দিষ্ট অংশ লোড করার ফলে নেটওয়ার্ক ট্রাফিক কম হয়।
Sorting (ডেটা ক্রমানুসারে সাজানো)
Sorting হলো ডেটাসেটকে নির্দিষ্ট ক্রমে সাজানোর প্রক্রিয়া। এটি বর্ধিত ব্যবহারকারীর অভিজ্ঞতা এবং কার্যকর ডেটা বিশ্লেষণের জন্য গুরুত্বপূর্ণ।
Sorting-এর প্রয়োজনীয়তা:
- ডেটার অর্থপূর্ণ উপস্থাপন: ডেটা ক্রমানুসারে সাজানো থাকলে এটি ব্যবহারকারীদের জন্য আরও অর্থপূর্ণ হয়।
- ডেটা অনুসন্ধান সহজ করে: প্রয়োজন অনুযায়ী সাজানো ডেটা দ্রুত খুঁজে পাওয়া যায়।
- ডেটা বিশ্লেষণে সহায়ক: সুনির্দিষ্ট ক্রমে থাকা ডেটা বিশ্লেষণ সহজ করে।
Spring Boot-এ Pagination এবং Sorting
স্প্রিং ডেটা JPA-এর মাধ্যমে Pagination এবং Sorting সহজে বাস্তবায়ন করা যায়। Pageable এবং Sort ইন্টারফেস ব্যবহার করে ডেটাবেস অপারেশন সম্পন্ন করা হয়।
Pagination এবং Sorting-এর উদাহরণ
Repository ইন্টারফেস উদাহরণ
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
Page<Product> findByNameContaining(String name, Pageable pageable);
}
Service লেয়ারে Pagination এবং Sorting
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Page<Product> getProducts(String name, int page, int size) {
Pageable pageable = PageRequest.of(page, size); // Pagination
return productRepository.findByNameContaining(name, pageable);
}
}
Controller উদাহরণ
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/products")
public Page<Product> getProducts(
@RequestParam(defaultValue = "") String name,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
return productService.getProducts(name, page, size);
}
}
Sorting যুক্ত করা
Sorting যুক্ত করতে PageRequest-এর মধ্যে Sort পাস করা যায়।
Pageable pageable = PageRequest.of(page, size, Sort.by("price").ascending());
উদাহরণ:
public Page<Product> getProductsSorted(String name, int page, int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by("name").descending()); // Sorting by name in descending order
return productRepository.findByNameContaining(name, pageable);
}
সুবিধা
- ডেটা নিয়ন্ত্রণ: Pagination-এর মাধ্যমে বড় ডেটাসেটের একযোগে লোডিং এড়ানো যায়।
- সার্ভার দক্ষতা: বড় ডেটাসেট নিয়ে কাজ করার সময় সার্ভার রিসোর্সের সঠিক ব্যবহার।
- ইউজার-ফ্রেন্ডলি: Pagination এবং Sorting ব্যবহারকারীর জন্য সহজ এবং কার্যকর ডেটা উপস্থাপনা নিশ্চিত করে।
- ডেটাবেস পারফরম্যান্স: ডেটাবেস কেরি দ্রুত সম্পন্ন হয়।
Pagination এবং Sorting এর মাধ্যমে স্প্রিং বুট অ্যাপ্লিকেশনে ডেটা ফেচিং কার্যকর এবং ব্যবহারকারী-বান্ধব করা যায়। এটি বড় ডেটাসেটের সঙ্গে কাজ করার সময় অপরিহার্য একটি ফিচার।
স্প্রিং বুট (Spring Boot) এ Pageable এবং Sort ইন্টারফেস ব্যবহার করে ডাটাবেস থেকে ডেটার পেজিনেশন এবং সঠিক ক্রমে (Sorting) ডেটা রিটার্ন করা যায়। এগুলো ব্যবহার করে বড় ডেটাসেটকে ছোট ছোট অংশে বিভক্ত করা এবং সেগুলোকে প্রয়োজন অনুযায়ী সাজানো সহজ হয়।
Pageable Interface
Pageable ইন্টারফেসটি পেজিনেশন কার্যকর করার জন্য ব্যবহৃত হয়। এটি ডাটার একটি নির্দিষ্ট অংশ (পেজ) ফেরত দেয় এবং প্রতিটি পেজে কতগুলো রেকর্ড থাকবে তা নির্ধারণ করে।
PageRequest তৈরি করা
PageRequest ক্লাসটি Pageable ইন্টারফেসের ইমপ্লিমেন্টেশন সরবরাহ করে। এটি পেজ নম্বর এবং পেজ সাইজ নির্ধারণে ব্যবহৃত হয়।
Pageable pageable = PageRequest.of(pageNumber, pageSize);
Sort Interface
Sort ইন্টারফেসটি ডেটা ক্রমবদ্ধ (Ascending বা Descending) করার জন্য ব্যবহৃত হয়। এটি এক বা একাধিক ফিল্ডের উপর ভিত্তি করে ডেটাকে সাজানোর সুযোগ দেয়।
Sort এর উদাহরণ
Ascending এবং Descending উভয় ধরণের ক্রমবিন্যাস করা যায়।
Sort sort = Sort.by("fieldName").ascending();
Sort sortDescending = Sort.by("fieldName").descending();
Pageable এবং Sort একসাথে ব্যবহার
Pageable এবং Sort একত্রে ব্যবহার করে পেজিনেটেড এবং সঠিক ক্রমে সাজানো ডেটা ফিল্টার করা সম্ভব।
Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by("fieldName").ascending());
Spring Data JPA তে Pageable এবং Sort এর ব্যবহার
Repository Method
Spring Data JPA এর রেপোজিটরি ইন্টারফেসে পেজিনেশন এবং সোর্টিং ফাংশনালিটি যুক্ত করা হয়:
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
Page<Product> findByCategory(String category, Pageable pageable);
}
কন্ট্রোলার এবং সার্ভিস স্তরে পেজিনেশন ও সোর্টিং প্রয়োগ
সার্ভিস লেয়ার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Page<Product> getProductsByCategory(String category, Pageable pageable) {
return productRepository.findByCategory(category, pageable);
}
}
কন্ট্রোলার লেয়ার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping
public Page<Product> getProducts(
@RequestParam String category,
@RequestParam int page,
@RequestParam int size,
@RequestParam String sortBy) {
Pageable pageable = PageRequest.of(page, size, Sort.by(sortBy).ascending());
return productService.getProductsByCategory(category, pageable);
}
}
Pagination এবং Sorting এর কার্যপ্রক্রিয়া
Request URL
GET /products?category=electronics&page=0&size=5&sortBy=price
Response (JSON)
{
"content": [
{ "id": 1, "name": "Phone", "price": 500 },
{ "id": 2, "name": "Laptop", "price": 1000 }
],
"pageable": {
"sort": { "sorted": true, "unsorted": false },
"pageNumber": 0,
"pageSize": 5
},
"totalPages": 10,
"totalElements": 50
}
Pageable এবং Sort এর সুবিধা
- ডেটা ব্যবস্থাপনা সহজ: বড় ডেটাসেটকে পেজ আকারে ভাগ করা।
- কাস্টমাইজেশন: প্রয়োজন অনুযায়ী ডেটার ক্রমবিন্যাস ও পেজ আকার নির্ধারণ।
- পারফরম্যান্স উন্নতি: ডাটাবেস থেকে অপ্রয়োজনীয় ডেটা লোড না করে নির্দিষ্ট পেজের ডেটা ফেরত দেওয়া।
- ফ্লেক্সিবিলিটি: একাধিক ফিল্ডের উপর ভিত্তি করে সঠিক ক্রমবিন্যাস করা।
সারাংশ
Spring Boot এ Pageable এবং Sort ইন্টারফেস ব্যবহার করে ডেটার পেজিনেশন এবং সঠিক ক্রমবিন্যাস কার্যকরভাবে করা সম্ভব। এটি REST API-তে ডেটার কার্যকর ব্যবস্থাপনার জন্য একটি আদর্শ পদ্ধতি। এভাবে বড় ডেটাসেটকে ছোট অংশে ভাগ করে ব্যবহারকারীর প্রয়োজন অনুসারে ডেটা উপস্থাপন করা সহজ হয়।
Spring Boot এবং Spring Data JPA সহজেই ডেটাবেসে Pagination (ডেটা পৃষ্ঠায় বিভক্ত) এবং Sorting (ডেটা সাজানো) অপারেশন সাপোর্ট করে। Pagination ডেটা ছোট ছোট অংশে ভাগ করে প্রদর্শন করে, যা পারফরম্যান্স উন্নত করে। Sorting ডেটাকে নির্দিষ্ট ক্রমে সাজিয়ে প্রদর্শন করতে সাহায্য করে।
Pagination এবং Sorting এর জন্য প্রয়োজনীয় ডিপেনডেন্সি
Maven ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
application.properties ফাইল কনফিগার করুন:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
Entity ক্লাস তৈরি
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
JpaRepository ইন্টারফেস তৈরি
Spring Data JPA-এর PagingAndSortingRepository বা JpaRepository ইন্টারফেস ব্যবহার করে Pagination এবং Sorting এর সুবিধা পাওয়া যায়।
import org.springframework.data.repository.PagingAndSortingRepository;
public interface ProductRepository extends PagingAndSortingRepository<Product, Long> {
}
Controller ক্লাস তৈরি
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductRepository repository;
// Pagination
@GetMapping("/paginate")
public Page<Product> getPaginatedProducts(@RequestParam int page, @RequestParam int size) {
Pageable pageable = PageRequest.of(page, size);
return repository.findAll(pageable);
}
// Sorting
@GetMapping("/sort")
public Iterable<Product> getSortedProducts(@RequestParam String sortBy, @RequestParam String direction) {
Sort sort = direction.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending();
return repository.findAll(sort);
}
// Pagination with Sorting
@GetMapping("/paginateAndSort")
public Page<Product> getPaginatedAndSortedProducts(
@RequestParam int page,
@RequestParam int size,
@RequestParam String sortBy,
@RequestParam String direction
) {
Sort sort = direction.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending();
Pageable pageable = PageRequest.of(page, size, sort);
return repository.findAll(pageable);
}
}
API সমূহ এবং তাদের ব্যবহার
Pagination API
- GET:
/products/paginate?page=0&size=5- প্রথম পৃষ্ঠা (Page 0), প্রতি পৃষ্ঠায় ৫টি আইটেম।
Sorting API
- GET:
/products/sort?sortBy=name&direction=ascnameএর উপর ভিত্তি করে Ascending Order।
- GET:
/products/sort?sortBy=price&direction=descpriceএর উপর ভিত্তি করে Descending Order।
Pagination এবং Sorting একত্রে
- GET:
/products/paginateAndSort?page=0&size=5&sortBy=price&direction=asc- প্রতি পৃষ্ঠায় ৫টি আইটেম,
priceএর উপর ভিত্তি করে Ascending Order।
- প্রতি পৃষ্ঠায় ৫টি আইটেম,
উদাহরণ ডেটা
যদি নিচের ডেটাগুলো ডেটাবেসে থাকে:
| ID | Name | Price |
|---|---|---|
| 1 | Product A | 100.0 |
| 2 | Product B | 150.0 |
| 3 | Product C | 120.0 |
| 4 | Product D | 200.0 |
| 5 | Product E | 180.0 |
| 6 | Product F | 170.0 |
Pagination Query (page=0, size=3):
[
{ "id": 1, "name": "Product A", "price": 100.0 },
{ "id": 2, "name": "Product B", "price": 150.0 },
{ "id": 3, "name": "Product C", "price": 120.0 }
]
Sorting Query (sortBy=price, direction=asc):
[
{ "id": 1, "name": "Product A", "price": 100.0 },
{ "id": 3, "name": "Product C", "price": 120.0 },
{ "id": 2, "name": "Product B", "price": 150.0 },
...
]
সারাংশ
Spring Boot এবং Spring Data JPA এর Pagination এবং Sorting ফিচার ডেটা ম্যানেজমেন্টকে আরও কার্যকর ও গতিশীল করে। এর মাধ্যমে বড় ডেটাবেসে কার্যক্ষমতার সাথে ডেটা প্রদর্শন এবং সাজানো যায়। এগুলো সহজে কনফিগার এবং API টেস্টিংয়ের জন্য খুবই সহায়ক।
Read more